package com.ruoyi.pack.service;

import java.util.List;
import com.ruoyi.pack.domain.PackTransferRecord;
import com.ruoyi.pack.domain.PackContainer;
import com.ruoyi.pack.domain.dto.PackContainerWarehouseInfoDTO;

/**
 * 移库记录Service接口
 * 
 * @author ruoyi
 * @date 2024-01-01
 */
public interface IPackTransferRecordService 
{
    /**
     * 查询移库记录
     * 
     * @param transferId 移库记录主键
     * @return 移库记录
     */
    public PackTransferRecord selectPackTransferRecordByTransferId(Long transferId);

    /**
     * 查询移库记录列表
     * 
     * @param packTransferRecord 移库记录
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectPackTransferRecordList(PackTransferRecord packTransferRecord);

    /**
     * 新增移库记录
     * 
     * @param packTransferRecord 移库记录
     * @return 结果
     */
    public int insertPackTransferRecord(PackTransferRecord packTransferRecord);

    /**
     * 修改移库记录
     * 
     * @param packTransferRecord 移库记录
     * @return 结果
     */
    public int updatePackTransferRecord(PackTransferRecord packTransferRecord);

    /**
     * 批量删除移库记录
     * 
     * @param transferIds 需要删除的移库记录主键集合
     * @return 结果
     */
    public int deletePackTransferRecordByTransferIds(Long[] transferIds);

    /**
     * 删除移库记录信息
     * 
     * @param transferId 移库记录主键
     * @return 结果
     */
    public int deletePackTransferRecordByTransferId(Long transferId);

    /**
     * 创建器具出库记录
     * 
     * @param container 器具信息
     * @param sourceWarehouseId 来源仓库ID
     * @param sourceWarehouseName 来源仓库名称
     * @param targetWarehouseId 目标仓库ID（可为空，表示不确定目标）
     * @param targetWarehouseName 目标仓库名称（可为空）
     * @param locationLogId 触发的定位日志ID
     * @param operatorName 操作员姓名
     * @return 移库记录ID
     */
    public Long createOutboundRecord(PackContainer container, 
                                   Long sourceWarehouseId, 
                                   String sourceWarehouseName,
                                   Long targetWarehouseId,
                                   String targetWarehouseName,
                                   Long locationLogId,
                                   String operatorName);

    /**
     * 创建器具入库记录（更新已有出库记录或创建新入库记录）
     * 
     * @param container 器具信息
     * @param targetWarehouse 目标仓库信息
     * @param locationLogId 触发的定位日志ID
     * @param operatorName 操作员姓名
     * @return 移库记录ID
     */
    public Long createInboundRecord(PackContainer container,
                                  PackContainerWarehouseInfoDTO targetWarehouse,
                                  Long locationLogId,
                                  String operatorName);

    /**
     * 根据器具ID查询最新的未完成移库记录（出库阶段且没有对应的入库记录）
     * 
     * @param containerId 器具ID
     * @return 移库记录
     */
    public PackTransferRecord selectLatestOutboundRecordByContainerId(Long containerId);

    /**
     * 根据器具ID查询移库记录列表
     * 
     * @param containerId 器具ID
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectPackTransferRecordListByContainerId(Long containerId);

    /**
     * 根据父移库记录ID查询入库记录
     * 
     * @param parentTransferId 父移库记录ID
     * @return 移库记录
     */
    public PackTransferRecord selectInboundRecordByParentTransferId(Long parentTransferId);

    /**
     * 查询器具的完整移库链路
     * 
     * @param containerId 器具ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectContainerTransferChain(Long containerId, String startTime, String endTime);

    /**
     * 统计指定时间范围内的移库次数
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param transferType 移库类型
     * @param transferStage 移库阶段
     * @return 移库次数
     */
    public int countTransferRecordsByTimeRange(String startTime, String endTime, String transferType, String transferStage);

    /**
     * 更新器具的出库记录为入库完成状态
     * 
     * @param containerId 器具ID
     * @param targetWarehouseId 目标仓库ID
     * @param targetWarehouseName 目标仓库名称
     * @param targetProjectId 目标项目ID
     * @param targetProjectCode 目标项目编码
     * @param targetProjectName 目标项目名称
     * @param inboundLocationLogId 入库定位日志ID
     * @param operatorName 操作员姓名
     * @return 是否更新成功
     */
    public boolean updateToInboundRecord(Long containerId,
                                       Long targetWarehouseId,
                                       String targetWarehouseName,
                                       Long targetProjectId,
                                       String targetProjectCode,
                                       String targetProjectName,
                                       Long inboundLocationLogId,
                                       String operatorName);

    /**
     * 根据汇总条件查询器具移动记录
     * 用于器具汇总统计页面的移动记录查询
     *
     * @param packTransferRecord 查询条件
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectTransferRecordsBySummaryCondition(PackTransferRecord packTransferRecord);
}